// @Title  请填写文件名称（需要改）
// @Description  请填写文件描述（需要改）
// @Author  请填写自己的真是姓名（需要改）  2021/2/2 22:46
// @Update  请填写自己的真是姓名（需要改）  2021/2/2 22:46
package gdbc

import (
	"database/sql"
	"errors"
	"log"
	"reflect"
	"taotaosql/pkg/core/ometa"
)





/*
   将查询结果集中数据装配成struct,会关闭Rows

   @param rows 数据库查询结果集
   @param resultMap 查询结果集对应的映射信息
   @return datas 装配好的数据
   @return err 错误信息
*/
func GetStructFromResult(rows *sql.Rows, resultMap *ometa.ResultMapping) (datas []interface{}, err error) {
	if nil == rows {
		return nil, errors.New("rows is nil")
	}

	if nil == resultMap {
		return nil, errors.New("resultMap is nil")
	}

	defer rows.Close()

	log.Println(rows.ColumnTypes())

	colTypes, err := rows.ColumnTypes()
	if nil != err {
		return nil, err
	}

	datas = make([]interface{}, 10)

	for rows.Next() {
		data := reflect.New(resultMap.StructType)
		v := reflect.ValueOf(data)

		//获取struct 对应的成员地址
		colCount := len(colTypes)
		rowData := make([]*interface{}, colCount)
		for i, ct := range colTypes {

			field := v.FieldByName(ct.Name())
			//没有此列映射关系
			if !field.IsValid() {
				continue
			}

			o := field.Interface()
			rowData[i] = &o
		}

		rows.Scan(rowData)

		_ = append(datas, data.Interface())

	}

	return datas, nil
}

